#pragma once
#include <string>
#include <map>
#include <vector>

namespace krryn{
namespace test{
	class basic_test_suite;
	class basic_report;

	class basic_runner{
	public:
		basic_runner();
		~basic_runner();

		void set_report(basic_report *a_Reporter);
		void add_suite(basic_test_suite &a_Suite, const std::string &a_Name);
		void run_all() const;
	private:
		typedef std::map<std::string, basic_test_suite *> suite_list_t;
		typedef std::vector<basic_test_suite *> duplicate_list_t;

		duplicate_list_t m_Duplicates;
		suite_list_t m_Suites;
		basic_report *m_Report;
	};

	static class init{
	public:
		init();
		~init();

		static basic_runner *add();
		static void remove();
	private:
		static size_t m_Counter;
	} _init;

	extern basic_runner *runner;

}
}